#include <cstring>
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
struct node
{
	int l;
	int r;
	int id;
}p[100100];
int ans[100100];
int a[100100];
int cnt[100100];
int n,m,temp;
bool cmp(node a,node b)
{
	if(a.l==b.l) return a.r<b.r;
	else return a.l<b.l;
}
void del(int pos)
{
	if(a[pos]!=0)
	{
		cnt[a[pos]]--;
		if(cnt[a[pos]]==a[pos]-1) temp--;
		if(cnt[a[pos]]==a[pos]) temp++;
	}
}
void add(int pos)
{
	if(a[pos]!=0)
	{
	//	printf("***a[pos]= %d\n",a[pos]);
		cnt[a[pos]]++;
	//	printf("***cnt[a[pos]]= %d\n",cnt[a[pos]]);
		if(cnt[a[pos]]==a[pos])
		{
			temp++;	
			//printf("+++%d\n",temp);
		}
		if(cnt[a[pos]]==a[pos]+1) temp--;
	}
}
int main()
{
	scanf("%d %d",&n,&m);
	int k = 0;
	memset(a,0,sizeof(a));
	for(int i = 1;i<=n;i++)
	{
		int num;
		scanf("%d",&num);
		if(num<=100000) a[i] = num;
	}
	for(int i = 1;i<=m;i++)
	{
		scanf("%d %d",&p[i].l,&p[i].r);
		p[i].id = i;
	}
	sort(p+1,p+1+m,cmp);
	int left = 1;
	int right = 0;
	temp = 0;
	for(int i = 1;i<=m;i++)
	{
		while(left<p[i].l) del(left++);
		while(left>p[i].l) add(--left);
		while(right>p[i].r) del(right--);
		while(right<p[i].r) add(++right);
		//printf("*****%d\n",temp);
		ans[p[i].id] = temp;
	}
	for(int i = 1;i<=m;i++) printf("%d\n",ans[i]);
}
